home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Development / Source / Sleep Deprivation 1.0 Source / Sleep Deprivation ƒ / sd code ƒ / sd main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-12  |  3.6 KB  |  134 lines  |  [TEXT/KAHL]

  1. /**********************************************************************\
  2.  
  3. File:        sd main.c
  4.  
  5. Purpose:    This module handles the sleep proc dispatch, doing the
  6.             Right Thing™ on sleep request, demand, and wake up.
  7.  
  8.  
  9. Sleep Deprivation -- graphic effects on sleep
  10. Copyright (C) 1993 Mark Pilgrim & Dave Blumenthal
  11.  
  12. This program is free software; you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation; either version 2 of the License, or
  15. (at your option) any later version.
  16.  
  17. This program is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with this program in a file named "GNU General Public License".
  24. If not, write to the Free Software Foundation, 675 Mass Ave,
  25. Cambridge, MA 02139, USA.
  26.  
  27. \**********************************************************************/
  28.  
  29. #include "sd main.h"
  30. #include "sd init.h"
  31. #include "globals.h"
  32.  
  33. void sdMain(void)
  34. {
  35.     // sorry about the assembly, but the codes are passed to the sleep proc in
  36.     // register d0, which is tough to check from C.
  37.     
  38.     asm
  39.     {
  40.         cmpi.l    #sleepRequest, d0
  41.         bne        @1
  42.         clr.l    d0
  43.         bra        @4
  44.     @1    cmpi.l    #sleepWakeUp, d0
  45.         bne        @2
  46.         movem.l    a0-a5/d0-d7, -(sp)
  47.     }
  48.     
  49.     // the system will not automatically redraw the screen; since we've blacked
  50.     // it out, we need to manually redraw it when the computer wakes up.
  51.     
  52.     DrawMenuBar();
  53.     PaintOne(0L,GrayRgn);
  54.     PaintBehind(WindowList,GrayRgn);
  55.     
  56.     asm
  57.     {
  58.         bra        @3
  59.     @2    cmpi.l    #sleepDemand, d0
  60.         bne        @4
  61.         movem.l    a0-a5/d0-d7, -(sp)
  62.     }
  63.     
  64.     sdDispatch((Ticks&0x7fffffff)%8);
  65.     
  66.     asm
  67.     {
  68.     @3    movem.l    (sp)+, a0-a5/d0-d7
  69.     @4
  70.     }
  71. }
  72.  
  73. void sdDispatch(int whichWipe)
  74. {
  75.     GrafPtr            thePtr;
  76.     int                oldMenuBarHeight;
  77.     long            oldA5;
  78.     QDGlobals        qd;                /* our QD globals. */
  79.     GrafPort        gp;                /* our grafport. */
  80.     GrafPtr            port;
  81.     GrafPtr            savePort;
  82.     
  83.     GetPort(&savePort);
  84.     oldMenuBarHeight=MBarHeight;
  85.     MBarHeight=0;
  86.     DrawMenuBar();
  87.  
  88.     /* get a value for A5, a structure that mirrors qd globals. */
  89.     oldA5 = SetA5((long)&qd.end);
  90.     InitGraf(&qd.thePort);
  91.     OpenPort(&gp);
  92.     port = &gp;
  93.     
  94.     HideCursor();
  95.     
  96.     if (whichWipe==0)        SpiralGyra(port, &qd.black);
  97.     else if (whichWipe==1)    CircularWipe(port, &qd.black);
  98.     else if (whichWipe==2)    BoxInWipe(port, &qd.black);
  99.     else if (whichWipe==3)    Skipaline(port, &qd.black);
  100.     else if (whichWipe==4)    RandomWipe(port, &qd.black);
  101.     else if (whichWipe==5)    FullScrollUD(port, &qd.black);
  102.     else if (whichWipe==6)    MrDo(port, &qd.black);
  103.     else if (whichWipe==7)    MrDoOutdone(port, &qd.black);
  104.  
  105. // You would think a simple switch-case statement would suffice, but you would
  106. // be mistaken.  In fact, the following switch-case causes a crash on a Powerbook
  107. // 100.  This is most likely a THINK C bug; it is super-optimizing the switch-case
  108. // so much that it no longer works on a 68000 machine.  The series of if-then-elses
  109. // is less elegant to the programmer, but more elegant to the user, since it
  110. // doesn't crash.  (:
  111.  
  112. #if 0
  113.     switch (whichWipe)
  114.     {
  115.         case 0:    SpiralGyra(port, &qd.black);    break;
  116.         case 1:    CircularWipe(port, &qd.black);    break;
  117.         case 2:    BoxInWipe(port, &qd.black);        break;
  118.         case 3:    Skipaline(port, &qd.black);        break;
  119.         case 4:    RandomWipe(port, &qd.black);    break;
  120.         case 5:    FullScrollUD(port, &qd.black);    break;
  121.         case 6:    MrDo(port, &qd.black);            break;
  122.         case 7:    MrDoOutdone(port, &qd.black);    break;
  123.     }
  124. #endif
  125.     
  126.     MBarHeight=oldMenuBarHeight;
  127.     ShowCursor();
  128.     ObscureCursor();
  129.     
  130.     ClosePort(&gp);
  131.     SetA5(oldA5);
  132.     SetPort(savePort);
  133. }
  134.